Skip to content

add verbosity controls + clean ui - #2193

Merged
kevinjosethomas merged 38 commits into
mainfrom
feat/ui-chat-output
Sep 12, 2026
Merged

add verbosity controls + clean ui#2193
kevinjosethomas merged 38 commits into
mainfrom
feat/ui-chat-output

Conversation

@kevinjosethomas

@kevinjosethomas kevinjosethomas commented Sep 10, 2026

Copy link
Copy Markdown
Member

Conversations open with assistant text visible, thinking hidden, tools collapsed, and compact per-file change summaries. The configurable Ctrl+O shortcut cycles through overview, thinking plus file diffs, and all output. The selected mode applies to streaming content and restored chats. Thinking renders as dim text without a repeated heading; expanded file diffs start at the normal chat inset while preserving code indentation and line-number gutters. A single status shows “Showing overview”, “Showing details”, or “Showing all output” with the configured expand or collapse shortcut. Unbound shortcuts omit the hint. Transcript rows, including sent and received agent messages, no longer repeat expansion hints.

Background shell completions update an identifiable originating IPython row: a running marker becomes a success check or a failure with its exit code. Matching prefers an exact saved BashHandle PID and command. Assignment-only cells do not save a handle, so a successful simple literal assignment can match by its unique exact full command; repeated commands, conflicting known PIDs, complex launches, and unmatched events retain compact “Background shell command finished” or failure notices. Completion rows share tool-row spacing without an extra gap below. All output shows the complete original notification once at the conversation position where it arrived to the model, after any intervening messages and tool output. The originating command retains its updated completion status but does not duplicate or relocate the notification body. Cell duration remains explicitly labeled as cell timing because completion events do not contain shell duration or output.

Expanded Python input nests directly beneath the tool summary with the same tree gutter as agent messages. The output marker appears beside output instead of input, and both bodies share the same text alignment. Multiline source indentation, syntax colors, error and image output, and full-width file diffs are preserved. The follow-output hint stays centered while scrolling over tabbed or wide-character output.

Assistant prose, thinking, collapsed tool previews, and trailing event details use quieter colors and less decorative bold. Sent and received agent messages keep compact notices in overview and details, with their full message bodies shown only in all output. Their separate Ctrl+P action and shortcut are removed. Multiline Python strings preserve their syntax color across source lines and narrow wrapping, including embedded Markdown and code snippets. Collapsed Python previews select statements outside string bodies. These are presentation changes; saved messages, JSONL traces, model/tool execution, and transport behavior are unchanged.

Validation: 66 focused Python layout, diff, ANSI-wrapping, background-output, and live/reopened chronology tests passed, along with 103 TUI fullscreen/overlay tests and npm run check. Faux-provider regressions cover notification order, matching and fallback behavior, detail cycling, agent-message visibility, and unchanged saved trace bytes; rendering checks cover syntax colors, narrow wrapping, error and image output, file-diff alignment, and follow-hint alignment.

Fixes ENG-6112.
Design context: UI proposals.


Note

Low Risk
Changes are mostly TUI presentation and keybindings; session traces and model/tool execution are unchanged, though background-shell matching logic adds moderate UI edge-case behavior.

Overview
Ctrl+O now cycles three presentation-only modes—overview (hidden thinking, collapsed tools/diffs), details (thinking + file diffs), and all output (full tool bodies and agent messages)—replacing separate Ctrl+J, Ctrl+T, and Ctrl+P toggles and the hideThinkingBlock setting. The status bar shows the current mode and expand/collapse shortcut; transcript rows drop repeated shortcut hints.

Assistant markdown body uses a new optional mdBody theme token (dimmer prose; headings/links/code unchanged). Thinking shows as unlabeled dim text; collapsed tool and Python previews are plain/dim; decorative bold is reduced across the TUI. Expanded file diffs align with normal chat inset without extra summary hints.

Background shell completions attach to matching IPython/bash tool rows via PID and command (with ambiguous/unmatched fallbacks), hide compact notices when attached, and show full notifications once at their original timeline position in “all output.” ShellCompletionComponent and createConversationSpacing fix row spacing around hidden thinking, agent messages, and late completions.

Python preview/highlighting fixes multiline string handling via pythonStatementLines; expanded IPython cells nest input under the summary with aligned output gutters.

Reviewed by Cursor Bugbot for commit d041b0d. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Replace separate expansion toggles with single Ctrl+O conversation-detail cycle and clean up TUI styling

  • Replaces independent message-expansion, edit-diff, and thinking-toggle keybindings with one app.tools.expand (Ctrl+O) action that cycles through overview, details (thinking + file diffs), and all output. Thinking starts hidden and is revealed in the details and all-output states.
  • Adds ShellCompletionComponent to render async background-shell completions. The factory in buildConversationComponents matches completion messages to prior tool executions by PID and command, marking ambiguous matches instead of attaching them.
  • Removes bold styling across tool titles, dialog headers, section labels, and diagnostic headings. Replaces muted with dim for metadata text, removes inline expand/collapse hints, and adds a dedicated mdBody theme color (falls back to text when unset) for assistant Markdown body.
  • Adds dynamic conversation spacing via createConversationSpacing, which inspects the current visible component sequence to decide leading blank lines and preceding tool activity, replacing the old static Spacer and suppressLeadingSpace logic.
  • Fixes Python preview extraction to skip multiline-string bodies and closing-punctuation-only lines, and fixes fullscreen follow-hint overlay placement to clip wide characters crossing the boundary.
  • Behavioral Change: SettingsManager no longer persists thinking-block visibility; InteractiveMode starts with thinking hidden. The hiddenThinkingLabel extension hook is retained but deprecated as a no-op. Keybinding migrations map the old Ctrl+P/Ctrl+J/Ctrl+T actions away; Ctrl+P is now free for editor cursor-up. The hideThinkingBlock setting is removed from SettingsSelectorComponent.

Macroscope summarized d041b0d.

@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown

Prime Agent performance — failed

PR d041b0d3 compared with main 126b43c0.

Overall: 0 regressed · 0 improved · 2 no clear change · 15 unavailable.

Metric Main This PR Change
Cold startup
Warm startup
Installation 27.17 s 26.51 s ≈ -0.66 s (-2.43%)
Compressed release artifacts 11.16 MB 11.16 MB ≈ +0.0045 MB (+0.04%)
Installed footprint
Idle memory, summed RSS

Python runtime

Metric Main This PR Change
Python kernel startup
Python cell round trip
Empty bash command
Bash git status
Bash 32 KiB output
35 cells / 9 shell calls
Python interrupt to done
Python state snapshot
Python state restore
Python idle RSS
Python RSS after pandas workload

Sandbox cost: ~$0.1944 — no inference calls.
Run, logs, and downloadable raw results

Methodology and samples

Main resolved at 2026-09-12T01:33:16.366467+00:00. Harness 126b43c0.
Linux x64, 4 vCPU, 8 GB RAM, 20 GB disk; region us.
Image: node:24-bookworm@sha256:be23f54a88d34e8824c741b19b91064094f92c1c97b194144bfc8b50d67258e2.
Stock tools, skills, daemon, and Python bootstrap enabled; fresh homes and a fixed Git fixture.
Onboarding is dismissed; the editor starts without a selected model or submitted prompt.
Medians shown. Arrows require a 20% timing/memory change plus absolute floors and IQR.
These practical noise floors are not a statistical significance test.
Cold means stopped Prime processes; OS filesystem caches are not flushed.
No model requests or credentials. Installation excludes build/setup time.
Installer tarballs use loopback; npm/Python downloads use the network with fresh caches.
Artifact size counts release tarballs; footprint after first use includes registry packages.
MB is decimal. Summed RSS can double-count shared pages; PSS is recorded when available.
Provisioning, setup, and build durations are recorded separately in the raw results.
Kernel probes use the installed JSONL runtime, outside the TUI/TypeScript host.
Per trial: 50 Python cells, 5 calls per shell case, and one 35-cell mix (9 git status calls).
Cell/shell values are batch means; other runtime timings are single operations.
State fixture: a 10,000-row × 8-column integer DataFrame and a 10,000-integer list.
Restore runs in a fresh kernel, including pandas imports; kernel startup is excluded.
Kernel RSS covers the isolated Python process; loaded RSS follows the pandas workload.
Costs estimate full sandbox lifetimes at configured rates, including setup and build.
Budget target: $1; not a billing cap. Checks are informational.

Metric Main successful/attempted PR successful/attempted Main spread PR spread
Cold startup 0/7 0/7
Warm startup 0/7 0/7
Installation 3/3 3/3 range 1.42 s range 1.35 s
Compressed release artifacts 1/1 1/1
Installed footprint 0/0 0/0
Idle memory, summed RSS 0/0 0/0
Python kernel startup 0/0 0/0
Python cell round trip 0/0 0/0
Empty bash command 0/0 0/0
Bash git status 0/0 0/0
Bash 32 KiB output 0/0 0/0
35 cells / 9 shell calls 0/0 0/0
Python interrupt to done 0/0 0/0
Python state snapshot 0/0 0/0
Python state restore 0/0 0/0
Python idle RSS 0/0 0/0
Python RSS after pandas workload 0/0 0/0

Failures:

  • Benchmark exceeded its runtime limit
  • main cold trial 0: TimeoutError: Timed out waiting for the expected terminal state
  • main cold trial 1: TimeoutError: Timed out waiting for the expected terminal state
  • main cold trial 2: TimeoutError: Timed out waiting for the expected terminal state
  • main cold trial 3: TimeoutError: Timed out waiting for the expected terminal state
  • main cold trial 4: TimeoutError: Timed out waiting for the expected terminal state
  • main cold trial 5: TimeoutError: Timed out waiting for the expected terminal state
  • main cold trial 6: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 0: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 1: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 2: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 3: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 4: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 5: TimeoutError: Timed out waiting for the expected terminal state
  • main warm trial 6: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 0: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 1: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 2: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 3: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 4: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 5: TimeoutError: Timed out waiting for the expected terminal state
  • PR cold trial 6: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 0: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 1: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 2: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 3: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 4: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 5: TimeoutError: Timed out waiting for the expected terminal state
  • PR warm trial 6: TimeoutError: Timed out waiting for the expected terminal state

Comment thread packages/coding-agent/src/modes/interactive/theme/theme-schema.json Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/coding-agent/src/modes/interactive/components/assistant-message.ts Outdated
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts Outdated
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts Outdated
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts Outdated
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts Outdated
@kevinjosethomas kevinjosethomas changed the title fix(tui): soften assistant output text color feat(tui): simplify conversation detail and quiet chat output Sep 10, 2026
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts
Comment thread packages/coding-agent/src/modes/interactive/components/assistant-message.ts Outdated
Comment thread packages/coding-agent/src/modes/interactive/components/shell-completion.ts Outdated
Comment thread packages/coding-agent/src/modes/interactive/components/conversation-components.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

kevinjosethomas added a commit that referenced this pull request Sep 11, 2026
Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts
Comment thread packages/coding-agent/README.md Outdated
Comment thread packages/coding-agent/docs/themes.md

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/coding-agent/src/modes/interactive/interactive-mode.ts
kevinjosethomas added a commit that referenced this pull request Sep 11, 2026
Incorporates #2180 at 9f36c23, #2182 at 5e841c0, #2183 at bf95115 and #2193 at cad6f03. Preserves the combined preview zero-count agents sections and purple refinement defaults.
@kevinjosethomas kevinjosethomas changed the title feat(tui): simplify conversation detail and quiet chat output add verbosity controls + clean ui Sep 12, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread packages/coding-agent/src/core/tools/code-preview.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4065182. Configure here.

Comment thread packages/coding-agent/src/core/tools/code-preview.ts
@kevinjosethomas
kevinjosethomas merged commit 370c562 into main Sep 12, 2026
25 checks passed
@kevinjosethomas
kevinjosethomas deleted the feat/ui-chat-output branch September 12, 2026 01:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants